package DAO;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import Model.Mensagem;
import Model.TipoMensagem;
import Utils.Conexao;

import com.mysql.jdbc.CallableStatement;

public class MensagemDAO {
	public static void Insert(Mensagem mensagem, ArrayList<String> destinatarios) throws SQLException
	{		
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_insert_mensagem(?, ?, ?, ?, ?, ?)";			
		CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);
		 
		for(int i = 0; i< destinatarios.size() ; i++)
		{
			int idDestinatario = Integer.parseInt(destinatarios.get(i));
			
			call.setInt(1, mensagem.getIdusuario());
			call.setInt(2, mensagem.getIdTipoMensagem());
			call.setInt(3, mensagem.getCdStatus());			
			call.setInt(4, idDestinatario);			
			call.setString(5, mensagem.getTituloMensagem());
			call.setString(6, mensagem.getTextoMensagem());
			call.execute();
		}	
	
		call.close();
		con.close();		
	}	
	
	public static Mensagem LoadObject(int idMensagem, int idusuario) throws SQLException
	{		
		Mensagem mensagem = null;
		Connection con = Conexao.getConection();

		// prepara a chamada da procedure
		String mysqlCall = "call spc_select_mensagem_por_id(?, ?)";		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, idMensagem);
		call.setInt(2, idusuario);
		ResultSet res = call.executeQuery();		
		
		if(res.next())
			mensagem = MensagemDAO.setInstance(res);
		
		con.close();
		call.close();
		return mensagem;
	}
	
	public static ArrayList<Mensagem> getArrayListMensagensEnviadas(int idUsuario)
	{
		Connection con = Conexao.getConection(); 
		ArrayList<Mensagem> arrMensagem = new ArrayList<Mensagem>();
		try
		{
			String mysqlCall = "call spc_select_mensagens_enviadas_por_usuario(?);";			
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
			call.setInt(1, idUsuario);
			ResultSet res = call.executeQuery();
			while(res.next())
			{
				Mensagem mensagem =  MensagemDAO.setInstance(res);
				arrMensagem.add(mensagem);
			}			
			call.close();
			con.close();			
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		
		return arrMensagem;
	}
	
	public static ArrayList<Mensagem> getArrayListMensagensRecebidas(int idUsuario)
	{
		Connection con = Conexao.getConection(); 
		ArrayList<Mensagem> arrMensagem = new ArrayList<Mensagem>();
		try
		{
			String mysqlCall = "call spc_select_mensagens_recebidas_por_usuario(?);";			
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
			call.setInt(1, idUsuario);
			ResultSet res = call.executeQuery();
			
			while(res.next())
			{
				Mensagem mensagem =  MensagemDAO.setInstance(res);
				arrMensagem.add(mensagem);
			}
			
			call.close();
			con.close();			
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		
		return arrMensagem;
	}

	
	public static void MudarStatusMensagem(int id_mensagem, int cd_status) throws SQLException	
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_mudar_status_mensagem(?, ?)";		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);		
		call.setInt(1, id_mensagem);
		call.setInt(2, cd_status);
		call.execute();
		
		call.close();		
		con.close();
	}
	
	public static void InativarMensagemRecebida(int id) throws SQLException
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_inativar_mensagem_recebida(?)";		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		
		call.setInt(1, id);
		call.execute();
		
		call.close();
		con.close();
	}
	
	public static void AlterarStatusMensagem(int idMensagem, int cdStatus) throws SQLException
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_update_mensagem_status(?, ?)";		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		
		call.setInt(1, cdStatus);
		call.setInt(2, idMensagem);		
		call.execute();
		
		call.close();
		con.close();
	}
	
	public static void InativarMensagemEnviada(int id) throws SQLException
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_inativar_mensagem_enviada(?)";		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);		
		call.setInt(1, id);
		call.execute();
		
		call.close();
		con.close();
	}
	
	public static Mensagem setInstance(ResultSet res) throws SQLException
	{
		Mensagem mensagem = new Mensagem();		
		mensagem.setIdMensagem(res.getInt("id_mensagem"));
		mensagem.setDataEmissao(res.getDate("data_emissao"));
		mensagem.setCdStatus(res.getInt("cd_status"));
		mensagem.setIdTipoMensagem(res.getInt("id_tipo_mensagem"));
		mensagem.setTextoMensagem(res.getString("texto_mensagem"));
		mensagem.setIdusuario(res.getInt("id_usuario"));		
		mensagem.setTituloMensagem(res.getString("titulo_mensagem"));
		mensagem.setIdDestinatario(res.getInt("id_destinatario"));

		// Inicializando Atributos relacionados
		mensagem.setRemetente(UsuarioDAO.LoadObject(res.getInt("id_usuario")));
		mensagem.setDestinatario(UsuarioDAO.LoadObject(res.getInt("id_destinatario")));
		mensagem.setTipoMensagem(TipoMensagemDAO.LoadObject(res.getInt("id_tipo_mensagem")));
		return mensagem;
	}	
}
